
# Create your views here.
import random

from django.http import HttpResponse
from django_redis import get_redis_connection
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework.views import APIView

from celery_tasks.sms.tasks import send_sms_code
from meiduo_mall.libs.captcha.captcha import captcha
from . import constants
from .  import serializers


# 定义视图  继承APIView
class ImageCodeView(APIView):
    #     根据请求方式定义函数
    def get(self, request, image_code_id):
        #         根据第三方扩展工具captcha生成图片验证码
        text, image = captcha.generate_captcha()
        # 用django中的get_redis_connection与redis数据库进行连接
        # 在配置redis中配置一个verify_codes数据库，用于存储验证码
        redis_conn = get_redis_connection("verify_codes")
        # 把图片验证码缓存到redis数据库中
        redis_conn.setex("img_%s" % image_code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)

        # 固定返回验证码图片数据，不需要REST framework框架的Response帮助我们决定返回响应数据的格式
        # 所以此处直接使用Django原生的HttpResponse即可
        return HttpResponse(image, content_type="image/jpg")

# 定义视图  因为需要验证等功能   继承GenericAPIView
class SMSCodeView(GenericAPIView):
    # 指定序列化器
    serializer_class = serializers.SMSCodeSerializer
    def get(self,request,mobile):
        """
        图片验证码序列化器
        """
#         获取传入的参数并进行校验
        serializer=self.get_serializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)
#         生成短信验证码
        sms_code="%06d"%random.randint(0,999999)

    #     存储到redis
    #     建立一个管道,管道的作用是可以同时把多个数据存到数据库
        redis_conn=get_redis_connection("verify_codes")
        pl=redis_conn.pipeline()
        # 把验证码保存到redis数据库
        pl.setex("sms_%s"%mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
    #     把验证码状态保存到redis数据库  参数1 手机号  参数2 过期时间  参数3 状态
        pl.setex("send_flag_%s"%mobile,constants.SEND_SMS_CODE_INTERVAL,1)
    #     执行管道
        pl.execute()
    #     实例化第三方云通讯的方法
    #     ccp=CCP()
    #     通过send_template_sms发送短信验证码  参数1 手机号  参数2 验证码以及过期时间 参数3 短信模板编号
    #     ccp.send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES//60],constants.SMS_CODE_TEMP_ID)
    #     执行celery异步任务
        send_sms_code.delay(mobile,sms_code)
        print(sms_code)
        # 因为要返回json数据 所以使用rest_framework里面的Response
        return Response({"message":"ok"})



